package com.pp.web.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pp.common.pojo.Post;
import com.pp.common.pojo.Tag;
import com.pp.common.vo.SysResult;
import com.pp.web.service.ITagService;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/tag")
public class TagController extends BaseController {

    @Resource
    private ITagService tagService;

    /**
     * 根据 tagName 返回对应的帖子分页对象
     * 请求方法: POST
     * 请求URL: http://localhost:8090/api/tag/tagName
     * 请求参数: tagName
     * 返回值: SysResult(responseMap) 响应对象
     */
    @GetMapping("/{tagName}")
    @SuppressWarnings({"unchecked", "varargs"})
    public SysResult getPostsByTagName(
        @PathVariable(value = "tagName") String tagName,
        @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
        @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        Map<String, Object> responseMap = new HashMap<>(16);

        // 根据 tagName 获取对应的 tag 对象
        LambdaQueryWrapper<Tag> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Tag::getTagName, tagName);
        Tag tag = tagService.getOne(lambdaQueryWrapper);
        // 若没有 tagName 对应的 tag，则提示 "标签不存在，或已被管理员删除"
        Assert.notNull(tag, "标签不存在，或已被管理员删除");

        // 若对应的 tag 存在，则查询其下的所有 posts
        Page<Post> topics = tagService.getPostsByTagId (
            new Page<>(pageNum, pageSize), tag.getId()
        );

        // 获取其他热门标签
        Page<Tag> otherHotTags = tagService.page(
            new Page<>(1, 10),
            new LambdaQueryWrapper<Tag>()
                .notIn(Tag::getTagName, tagName)
                .orderByDesc(Tag::getPostNum)
        );

        // 在 responseMap 中放入 posts
        responseMap.put("posts", topics);
        // 在 map 中放入 tags
        responseMap.put("otherHotTags", otherHotTags);

        // 返回 responseMap
        return SysResult.success(responseMap);
    }

}
